# backend/modules/forecasting/models.py
from ...extensions import db, get_beijing_time  # 从扩展模块导入数据库对象db和获取北京时间的函数

# 定义Forecast类，继承自db.Model，表示一个数据库模型
class Forecast(db.Model):
    __tablename__ = 'forecasts'  # 指定该模型对应的数据库表名为'forecasts'

    # 定义主键id字段，类型为整数，唯一标识每个Forecast记录
    id = db.Column(db.Integer, primary_key=True)

    # 定义模型类型字段，最大长度为50，不能为空
    model_type = db.Column(db.String(50), nullable=False)

    # 定义结果字段，类型为文本，存储预测结果，不能为空
    result = db.Column(db.Text, nullable=False)

    # 定义时间戳字段，记录创建时间，默认为获取的北京时间
    timestamp = db.Column(db.DateTime, default=get_beijing_time)

    # 定义预测周期字段，表示预测的天数，不能为空
    prediction_period = db.Column(db.Integer, nullable=False)

    # 定义库存建议字段，存储为JSON字符串，不能为空
    inventory_suggestions = db.Column(db.Text, nullable=False)

    # 定义分类字段，最大长度为100，不能为空，并在此字段上建立索引以加速查询
    category = db.Column(db.String(100), nullable=False, index=True)

    # 定义外键字段，关联uploaded_files表的id，不能为空
    uploaded_file_id = db.Column(db.Integer, db.ForeignKey('uploaded_files.id'), nullable=False)

    # 建立与UploadedFile类的双向关系，便于访问相关上传文件
    uploaded_file = db.relationship('UploadedFile', back_populates='forecasts')

    # 定义最后日期字段，类型为日期，记录最后的预测日期，不能为空
    last_date = db.Column(db.Date, nullable=False)

    # 定义与Visualization类的关系，设置级联操作并删除孤儿对象
    visualizations = db.relationship('Visualization', back_populates='forecast', cascade='all, delete-orphan')

    # 定义与Report类的关系，设置级联操作并删除孤儿对象
    reports = db.relationship('Report', back_populates='forecast', cascade='all, delete-orphan')

    # 定义与DemandForecast类的关系，设置级联操作并删除孤儿对象
    demand_forecasts = db.relationship('DemandForecast', back_populates='forecast', cascade="all, delete-orphan")

    # 定义类的字符串表示方法，便于调试及日志记录
    def __repr__(self):
        return f"<Forecast {self.model_type} - ID {self.id}>"  # 返回包含模型类型和ID的信息
